热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

求Q(x)模X^n+1的余数多项式的FFT算法

贴上IFFT算法的C语言代码:https:blog.csdn.netgreat978articledetails84306827 模的余数多项式,最高次数不超过n,令其余数多项式的

贴上IFFT算法的C语言代码:https://blog.csdn.net/great978/article/details/84306827

 

《求Q(x)模X^n + 1的余数多项式的FFT算法》《求Q(x)模X^n + 1的余数多项式的FFT算法》的余数多项式,最高次数不超过n,令其余数多项式的形式为《求Q(x)模X^n + 1的余数多项式的FFT算法》

 

1、因为《求Q(x)模X^n + 1的余数多项式的FFT算法》有n个解,对应余数多项式有n个,分别是《求Q(x)模X^n + 1的余数多项式的FFT算法》其中,0<=j<=n-1,而《求Q(x)模X^n + 1的余数多项式的FFT算法》则是《求Q(x)模X^n + 1的余数多项式的FFT算法》的n个解,而《求Q(x)模X^n + 1的余数多项式的FFT算法》是容易求的,

《求Q(x)模X^n + 1的余数多项式的FFT算法》,但是如果每个都往《求Q(x)模X^n + 1的余数多项式的FFT算法》里面带入的话,会花费大量的计算量。

 

这里提一种基于FFT的简单运算,这里要求《求Q(x)模X^n + 1的余数多项式的FFT算法》。(这里对为什么是基于FFT的我也不是很明白,有一说是

《求Q(x)模X^n + 1的余数多项式的FFT算法》的多项式的离散傅里叶变换,用快速傅里叶变换FFT计算得来的,DFS的公式这儿就不列出了)

 

2、计算算法,因为《求Q(x)模X^n + 1的余数多项式的FFT算法》,把《求Q(x)模X^n + 1的余数多项式的FFT算法》按奇偶项分开,每次分开一半,直到最后只剩两项的时候进行计算,然后一直递归向上,这样就把大量的乘幂运算转化为了加法运算,下面给出C语言的代码

 


//
#include "stdafx.h"
#define _CRT_SECURE_NO_WARNINGS
#include "stdlib.h"
#include "math.h"
#include "stdio.h"
#define K 3
#define Pi 3.1415927 //定义圆周率Pi
#define LEN sizeof(struct Compx) //定义复数结构体大小
//-----定义复数结构体-----------------------
struct Compx
{
double real;
double imag;
}Compx;
//-----复数乘法运算函数---------------------
struct Compx mult(struct Compx b1, struct Compx b2)
{
struct Compx b3;
b3.real = b1.real*b2.real - b1.imag*b2.imag;
b3.imag = b1.real*b2.imag + b1.imag*b2.real;
return(b3);
}
//-----复数加法运算函数---------------------
struct Compx add(struct Compx a, struct Compx b)
{
struct Compx c;
c.real = a.real + b.real;
c.imag = a.imag + b.imag;
return(c);
}
struct Compx FFT(struct Compx *t , int n , struct Compx root , struct Compx result ) ;
int main( )
{
int N,i;
N =8;
int x[8];
for( i = 0 ; i {
scanf("%d",&x[i]);
}

struct Compx * Source = (struct Compx *)malloc(N*LEN); //为结构体分配存储空间
struct Compx * Result = (struct Compx *)malloc(N*LEN);
struct Compx * Root = (struct Compx *)malloc(N*LEN);

//初始化=======================================
printf("\nSource初始化:\n");
for (i = 0; i {
Source[i].real = x[i];
Source[i].imag = 0;
printf("%.4f ", Source[i].real);
printf("+%.4fj ", Source[i].imag);
printf("\n");
}
printf("\nResult初始化:\n");
for (i = 0; i {
Result[i].real = 0;
Result[i].imag = 0;
printf("%.4f ", Result[i].real);
printf("+%.4fj ", Result[i].imag);
printf("\n");
}
printf("\nRoot初始化:\n");
for (i = 0; i {
Root[i].real = cos( 2 * Pi * ( 2 * i + 1) / (2 * N));
Root[i].imag = sin( 2 * Pi * ( 2 * i + 1) / (2 * N));
printf("%.4f ", Root[i].real);
printf("+%.4fj ", Root[i].imag);
printf("\n");
}

for( i = 0 ; i {
Result[i] = FFT(Source , N , Root[i] , Result[i]);
}

//结果表示
printf("\nResult计算结果:\n");
for (i = 0; i {
printf("%.4f ", Result[i].real);
printf("+%.4fj ", Result[i].imag);
printf("\n");
}

return 0;
}
struct Compx FFT(struct Compx *t , int n , struct Compx root , struct Compx result )
{
int i,j;
struct Compx * even = (struct Compx *)malloc((n / 2) * LEN);
struct Compx * odd = (struct Compx *)malloc((n / 2) * LEN);

//划分奇偶项
for (i = 0 , j = 0 ; i {
even[j].real = t[i].real;
even[j].imag = t[i].imag;
}
for (i = 1 , j = 0 ; i {
odd[j].real = t[i].real;
odd[j].imag = t[i].imag;
}

if(n == 2)
{
struct Compx s = add( even[0] , mult( root , odd[0]) );
return add(result , s);
}
else
{
return add( FFT(even , n / 2 , mult(root , root) , result ) , mult( root , FFT(odd , n / 2 , mult(root , root) , result ) ) );
}
}

2018年11月20日更新:代码中root根值计算有错误,上述代码中已修改 :

新的代码中是:

Root[i].real = cos( 2 * Pi * ( 2 * i + 1) / (2 * N));
Root[i].imag = sin( 2 * Pi * ( 2 * i + 1) / (2 * N));

之前代码是:

Root[i].real = cos( Pi * ( 2 * i + 1) / (2 * N));
Root[i].imag = sin( Pi * ( 2 * i + 1) / (2 * N));

欢迎指正!

转:https://www.cnblogs.com/cg-bestwishes/p/10681152.html


推荐阅读
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • c语言基础编写,c语言 基础
    本文目录一览:1、C语言如何编写?2、如何编写 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • C语言判断正整数能否被整除的程序
    本文介绍了使用C语言编写的判断正整数能否被整除的程序,包括输入一个三位正整数,判断是否能被3整除且至少包含数字3的方法。同时还介绍了使用qsort函数进行快速排序的算法。 ... [详细]
  • 本文介绍了使用Python解析C语言结构体的方法,包括定义基本类型和结构体类型的字典,并提供了一个示例代码,展示了如何解析C语言结构体。 ... [详细]
  • 实现一个通讯录系统,可添加、删除、修改、查找、显示、清空、排序通讯录信息
    本文介绍了如何实现一个通讯录系统,该系统可以实现添加、删除、修改、查找、显示、清空、排序通讯录信息的功能。通过定义结构体LINK和PEOPLE来存储通讯录信息,使用相关函数来实现各项功能。详细介绍了每个功能的实现方法。 ... [详细]
  • 本文介绍了一种图的存储和遍历方法——链式前向星法,该方法在存储带边权的图时时间效率比vector略高且节省空间。然而,链式前向星法存图的最大问题是对一个点的出边进行排序去重不容易,但在平行边无所谓的情况下选择这个方法是非常明智的。文章还提及了图中搜索树的父子关系一般不是很重要,同时给出了相应的代码示例。 ... [详细]
  • 《2017年3月全国计算机等级考试二级C语言上机题库完全版》由会员分享,可在线阅读,更多相关《2017年3月全国计算机等级考试二级C语言上机题库完全版( ... [详细]
  • 利用空间换时间减少时间复杂度以及以C语言字符串处理为例减少空间复杂度
    在处理字符串的过程当中,通常情况下都会逐个遍历整个字符串数组,在多个字符串的处理中,处理不同,时间复杂度不同,这里通过利用空间换时间等不同方法,以字符串处理为例来讨论几种情况:1: ... [详细]
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼*madebyebhrz*#include#include#include#include#include#include#include ... [详细]
  • C语言的经典程序有哪些
    本篇内容介绍了“C语言的经典程序有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何 ... [详细]
  • 初探PLC 的ST 语言转换成C++ 的方法
    自动控制软件绕不开ST(StructureText)语言。它是IEC61131-3标准中唯一的一个高级语言。目前,大多数PLC产品支持ST ... [详细]
  • C语言学习笔记—链表(二)链表的静态添加及动态遍历
    链表的静态添加及动态遍历我们知道数组中的数据存储是有序的,而链表中的数据是无序的但是存在某种联系使之组成链表。那么我们如果向一组数据中添加一个数据元素, ... [详细]
author-avatar
存在米小寒_151
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有